iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
自我挑戰組

一天一招,快速上手 mpv-lazy系列 第 26

Day26:MPC + VapourSynth:嘗試移植 mpv-lazy 的 RIFE 腳本

  • 分享至 

  • xImage
  •  

我過去用過最省資源播放器是 mpc,我們在 mpv 用的腳本在 mpc 會不會有更好效能體驗,我這邊就想嘗試看看。

mpv-lazy 那些 .vpy 腳本,能不能搬到 MPC 上跑?

答案是可以,但我最後的結論是不建議搬。這篇會把理由講清楚,因為「試了發現不值得」也是有用的資訊。

安裝流程

這邊我是直接使用 SVP Pro4 MPC-HC,這邊有要用的自己安裝。

安裝 VapourSynth Filter 在 MPC

第一步,先裝 VapourSynth。 這條路不能用 mpv-lazy 內建的那份 —— DirectShow 濾鏡是系統層的東西,它要找系統裝好的 VapourSynth。要 R55 以上。

第二步,下載解壓。CrendKing/avisynth_filter 抓 release,檔名是 SynthFilters.zip(不到 1MB)。

解壓到一個你絕對不會搬動的目錄。

第三步,以系統管理員執行 install.cmd

https://ithelp.ithome.com.tw/upload/images/20260814/20182793BKoOOhik3q.png

那個 install.cmd 裡面其實只有三行,就是叫 regsvr32 去註冊三個 .ax 檔。而且它自己不會檢查有沒有管理員權限 —— 沒有的話會失敗或跳 UAC,但腳本不會告訴你「你忘了用管理員身分」。

第四步,在 MPC 裡加進外部濾鏡。

MPC-HC 的路徑是:檢視 → 選項 → 內建濾鏡 → 外部濾鏡分頁 → Add Filter → 從清單裡選 VapourSynth Filter

https://ithelp.ithome.com.tw/upload/images/20260814/201827937jE0luxHuc.png

MPC-BE 的話「外部篩選器」是左側清單直接一項,不在內建濾鏡底下。

第五步,在濾鏡的內容頁指定要載入哪個 .vpy 檔。

import vapoursynth as vs
from vapoursynth import core
import k7sfunc as k7f

clip = VpsFilterSource                      # 原本是 video_in
clip = k7f.FMT_CTRL(clip, h_max=1080)
clip = k7f.RIFE_NV(clip, model=46,
                   fps_in=VpsFilterSource.fps,   # 原本是 container_fps
                   fps_num=2, gpu=0, gpu_t=2)
clip.set_output()

再來設定腳本就會生效。

https://ithelp.ithome.com.tw/upload/images/20260814/20182793EgOvmiwbqf.png

為什麼一定要「註冊到系統」
這一步很多教學只說「要跑 install.cmd」,不說為什麼,結果出問題的人不知道往哪查。

DirectShow 濾鏡是 COM 元件。 播放器不是去掃某個資料夾找濾鏡檔,而是去問 Windows:「系統裡註冊了哪些 DirectShow 濾鏡?」

regsvr32 做的事就是把「這個濾鏡的識別碼 → 這個 .ax 檔的絕對路徑」寫進註冊表。

mpc 和 mpv vpy 變數不一樣

這是全篇最硬的一節,也是「不值得搬」這個結論的主要來源。

mpv 執行 .vpy 的時候會注入七個變數給腳本用:

video_in        # 來源 clip
video_in_dw     # 來源顯示寬度
video_in_dh     # 來源顯示高度
container_fps   # 片源幀率
display_fps     # 螢幕更新率
display_res     # 螢幕解析度
user_data       # 使用者自訂資料

而 DirectShow 這個濾鏡只注入三個,名字也完全不同:

VpsFilterSource      # 來源 clip
VpsFilterSourcePath  # 來源檔案路徑
VpsFilterDisconnect  # 設非零值可以讓濾鏡自己脫離

所以你把 mpv-lazy 的 .vpy 原封不動丟給 MPC,Python 在第一次碰到 video_in 的時候就 NameError,腳本載入失敗。

能對應的部分:

  • video_in → 改成 VpsFilterSource
  • container_fps → 改成 VpsFilterSource.fps(這個濾鏡會把 clip 的 fps 屬性設成平均幀率,社群的說法是等價於 mpv 的 container_fps

改完之後大概長這樣:

import vapoursynth as vs
from vapoursynth import core
import k7sfunc as k7f

clip = VpsFilterSource                      # 原本是 video_in
clip = k7f.FMT_CTRL(clip, h_max=1080)
clip = k7f.RIFE_NV(clip, model=46,
                   fps_in=VpsFilterSource.fps,   # 原本是 container_fps
                   fps_num=2, gpu=0, gpu_t=2)
clip.set_output()

相關文章


上一篇
Day25:另一套 mpv 懶人包:dyphire/mpv-config 介紹
下一篇
Day27:我一路用過的播放器
系列文
一天一招,快速上手 mpv-lazy30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言